package com.example.demo.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

/**
 * 用户实体类
 * 对应数据库中的 users 表
 *
 * 注解说明：
 * @Entity - 声明这是一个 JPA 实体类，会映射到数据库表
 * @Table - 指定数据库表名
 * @Data - Lombok 注解，自动生成 getter/setter/toString/equals/hashCode 方法
 * @NoArgsConstructor - Lombok 注解，生成无参构造函数
 * @AllArgsConstructor - Lombok 注解，生成全参构造函数
 */
@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    /**
     * 用户ID（主键）
     * @Id - 声明主键
     * @GeneratedValue - 主键生成策略，IDENTITY 表示使用数据库自增
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 用户姓名
     * @Column - 指定数据库字段属性
     * @NotBlank - 数据验证：不能为空，且去除空格后长度大于 0
     */
    @Column(name = "name", nullable = false, length = 100)
    @NotBlank(message = "用户姓名不能为空")
    private String name;

    /**
     * 用户邮箱
     * @Email - 数据验证：必须是有效的邮箱格式
     * @NotBlank - 数据验证：不能为空
     * unique = true - 唯一约束，同一邮箱不能重复
     */
    @Column(name = "email", nullable = false, unique = true, length = 100)
    @NotBlank(message = "邮箱不能为空")
    @Email(message = "邮箱格式不正确")
    private String email;

    /**
     * 创建时间
     * @CreationTimestamp - Hibernate 注解，自动设置创建时间
     * updatable = false - 表示该字段在更新时不会被修改
     */
    @Column(name = "created_at", updatable = false)
    @CreationTimestamp
    private LocalDateTime createdAt;

    /**
     * 更新时间
     * @UpdateTimestamp - Hibernate 注解，自动更新修改时间
     */
    @Column(name = "updated_at")
    @UpdateTimestamp
    private LocalDateTime updatedAt;

    /**
     * 自定义构造函数（不包含 ID 和时间戳字段）
     * 用于创建新用户时使用
     *
     * @param name 用户姓名
     * @param email 用户邮箱
     */
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
}
